/**
 ******************************************************************************
 * @file           : bsp_dma.h
 * @brief          : DMA Driver Header File (STM32F4xx)
 ******************************************************************************
 * @attention
 *
 * DMA驱动头文件
 * 提供简化的DMA操作接口
 * STM32F4xx使用DMA Stream
 *
 ******************************************************************************
 */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __BSP_DMA_H
#define __BSP_DMA_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
#include "./BSP/DMA/bsp_dma_config.h"

/* Exported types ------------------------------------------------------------*/

/**
 * @brief DMA传输方向枚举
 */
typedef enum
{
    DMA_DIR_PERIPH_TO_MEMORY = 0,   /*!< 外设到内存 */
    DMA_DIR_MEMORY_TO_PERIPH,       /*!< 内存到外设 */
    DMA_DIR_MEMORY_TO_MEMORY        /*!< 内存到内存 */
} DMA_Direction_e;

/**
 * @brief DMA数据宽度枚举
 */
typedef enum
{
    DMA_DATA_WIDTH_BYTE = 0,        /*!< 8位 */
    DMA_DATA_WIDTH_HALFWORD,        /*!< 16位 */
    DMA_DATA_WIDTH_WORD             /*!< 32位 */
} DMA_DataWidth_e;

/**
 * @brief DMA优先级枚举
 */
typedef enum
{
    DMA_PRIORITY_LOW = 0,           /*!< 低优先级 */
    DMA_PRIORITY_MEDIUM,            /*!< 中优先级 */
    DMA_PRIORITY_HIGH,              /*!< 高优先级 */
    DMA_PRIORITY_VERY_HIGH          /*!< 极高优先级 */
} DMA_Priority_e;

/**
 * @brief DMA传输模式枚举
 */
typedef enum
{
    DMA_MODE_NORMAL = 0,            /*!< 正常模式 */
    DMA_MODE_CIRCULAR               /*!< 循环模式 */
} DMA_Mode_e;

/**
 * @brief DMA错误码枚举
 */
typedef enum
{
    DMA_OK = 0,                     /*!< 成功 */
    DMA_ERROR_PARAM,                /*!< 参数错误 */
    DMA_ERROR_BUSY,                 /*!< DMA忙 */
    DMA_ERROR_TIMEOUT,              /*!< 超时 */
    DMA_ERROR_TRANSFER              /*!< 传输错误 */
} DMA_Error_e;

/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported variables --------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/

/* 内存到内存传输 */
void dma_memcpy(void *dst, const void *src, uint32_t size);
void dma_memset(void *dst, uint8_t value, uint32_t size);

#ifdef __cplusplus
}
#endif

#endif /* __BSP_DMA_H */
